package com.fa7.trabalho.controller;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;

import com.fa7.trabalho.dao.PerfilDao;
import com.fa7.trabalho.dao.SeguidorSeguinteDao;
import com.fa7.trabalho.dao.UsuarioDao;
import com.fa7.trabalho.entidades.Perfil;
import com.fa7.trabalho.entidades.SeguidorSeguinte;
import com.fa7.trabalho.entidades.Usuario;
import com.fa7.trabalho.service.PerfilService;

@ManagedBean(name="seguidorSeguinteBean")
@SessionScoped
public class SeguidorSeguinteBean implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -3014058569470641114L;
	
	private Usuario usuarioLogado;
	
	private SeguidorSeguinte seguidorSeguinte;
	
	private List<SeguidorSeguinte> listaSeguidos;
	
	private String usuarioBusca;
	private List<Usuario> listaUsuariosSeguir;
	
	private Perfil usuarioSeguinte;
	
	@ManagedProperty(name = "perfilService", value = "#{perfilService}")
	private PerfilService perfilService;
	

	@ManagedProperty(name = "seguidorSeguinteDao", value = "#{seguidorSeguinteDao}")
	private SeguidorSeguinteDao seguidorSeguinteDao;
	
	@ManagedProperty(name = "usuarioDao", value = "#{usuarioDao}")
	private UsuarioDao usuarioDao;
	
	@ManagedProperty(name = "perfilDao", value = "#{perfilDao}")
	private PerfilDao perfilDao;

	
	public Usuario getUsuarioLogado() {
		return usuarioLogado;
	}

	public void setUsuarioLogado(Usuario usuarioLogado) {
		this.usuarioLogado = usuarioLogado;
	}

	public SeguidorSeguinte getSeguidorSeguinte() {
		return seguidorSeguinte;
	}

	public void setSeguidorSeguinte(SeguidorSeguinte seguidorSeguinte) {
		this.seguidorSeguinte = seguidorSeguinte;
	}

	public List<SeguidorSeguinte> getListaSeguidos() {
		return listaSeguidos;
	}

	public void setListaSeguidos(List<SeguidorSeguinte> listaSeguidos) {
		this.listaSeguidos = listaSeguidos;
	}

	public SeguidorSeguinteDao getSeguidorSeguinteDao() {
		return seguidorSeguinteDao;
	}

	public void setSeguidorSeguinteDao(SeguidorSeguinteDao seguidorSeguinteDao) {
		this.seguidorSeguinteDao = seguidorSeguinteDao;
	}

	public UsuarioDao getUsuarioDao() {
		return usuarioDao;
	}

	public void setUsuarioDao(UsuarioDao usuarioDao) {
		this.usuarioDao = usuarioDao;
	}

	
	@PostConstruct
	public void init(){
		setUsuarioLogado(new Usuario());
		SecurityContext context = SecurityContextHolder.getContext();
		if (context instanceof SecurityContext) {
			Authentication authentication = context.getAuthentication();
			if (authentication instanceof Authentication) {
				setUsuarioLogado(getUsuarioDao().findByUsername(
						((User) authentication.getPrincipal()).getUsername()));
			}
		}
		listaSeguidos();
	}
	
	
	public void listaSeguidos(){
		
		setUsuarioLogado(getUsuarioDao().findByUsername(usuarioLogado.getUsername()));
		List<SeguidorSeguinte> seguidos = usuarioLogado.getPerfil().getSeguintes();
		setListaSeguidos(seguidos);
		
	}
	
	public String buscarUsuarioSeguir(){
			
		List<Usuario> listaUsuarios = getUsuarioDao().findByUsernameLike(getUsuarioBusca());
		setListaUsuariosSeguir(listaUsuarios);
		
		return usuarioBusca = "";
	}

	public String seguir(){
		
		Perfil usuarioSeguidor = usuarioLogado.getPerfil();
		Perfil usuarioSeguido = usuarioSeguinte;
		
		if (usuarioSeguidor.getId() != usuarioSeguido.getId() ) {
			
			SeguidorSeguinte seguidor = new SeguidorSeguinte();
			seguidor.setSeguidor(usuarioSeguidor);
			seguidor.setSeguinte(usuarioSeguido);
			
			seguidorSeguinteDao.save(seguidor);
			seguidorSeguinteDao.flush();
		}
		
		listaSeguidos();
		setListaUsuariosSeguir(null);
		
		return "";
	}
	
	public boolean isSeguinte(){
		Perfil usuarioSeguidor = usuarioLogado.getPerfil();
		return perfilService.isSeguinte(usuarioSeguidor, this.usuarioSeguinte);
	}

	public List<Usuario> getListaUsuariosSeguir() {
		return listaUsuariosSeguir;
	}

	public void setListaUsuariosSeguir(List<Usuario> listaUsuariosSeguir) {
		this.listaUsuariosSeguir = listaUsuariosSeguir;
	}

	public String getUsuarioBusca() {
		return usuarioBusca;
	}

	public void setUsuarioBusca(String usuarioBusca) {
		this.usuarioBusca = usuarioBusca;
	}

	public Perfil getUsuarioSeguinte() {
		return usuarioSeguinte;
	}

	public void setUsuarioSeguinte(Perfil usuarioSeguinte) {
		this.usuarioSeguinte = usuarioSeguinte;
	}

	public PerfilService getPerfilService() {
		return perfilService;
	}

	public void setPerfilService(PerfilService perfilService) {
		this.perfilService = perfilService;
	}

	public PerfilDao getPerfilDao() {
		return perfilDao;
	}

	public void setPerfilDao(PerfilDao perfilDao) {
		this.perfilDao = perfilDao;
	}

}
